package fr.ul.ade.secunde.database;

import android.content.ContentUris;
import android.net.Uri;
import android.provider.BaseColumns;

/**
 * Interface pour les données accessibles de notre application.
 * 
 * <p>
 * Contient les noms des tables et des attributs accessibles via le
 * {@link android.content.ContentProvider ContentProvider} d'Android ainsi que
 * diverses méthodes auxiliaires, notamment pour la construction et pour le
 * traitement des URI correspondantes.
 * 
 * @author Michaël Schnell
 * @since Jul 5, 2013
 * 
 * @version 1.6
 */
public final class AdeWebContract {

	public static final String CONTENT_AUTHORITY = "fr.ul.ade"; //$NON-NLS-1$

	public static final Uri BASE_CONTENT_URI = Uri
			.parse("content://" + CONTENT_AUTHORITY); //$NON-NLS-1$

	public static final String PATH_SCHEDULE = "schedule"; //$NON-NLS-1$
	public static final String PATH_LESSON = "lesson"; //$NON-NLS-1$
	public static final String PATH_PROJECT = "project"; //$NON-NLS-1$
	public static final String PATH_STUDENT_NUMBER = "student_number"; //$NON-NLS-1$
	public static final String PATH_ERROR = "error"; //$NON-NLS-1$

	public static final String PATH_BETWEEN = "between"; //$NON-NLS-1$
	public static final String PATH_DISPLAY = "display"; //$NON-NLS-1$
	public static final String PATH_CREATE = "create"; //$NON-NLS-1$

	private AdeWebContract() {
	}

	/**
	 * Attributs relatifs aux emplois du temps (sauf cours).
	 */
	interface ScheduleColumns {
		/** Nom de l'emploi du temps. */
		String SCHEDULE_NAME = "name"; //$NON-NLS-1$
		/** Description facultative de l'emploi du temps. */
		String SCHEDULE_DESCRIPTION = "description"; //$NON-NLS-1$
		/** Etat de synchronisation de l'emploi du temps. */
		String SCHEDULE_STATE = "state"; //$NON-NLS-1$
		/** Date de la dernière synchronisation de l'emploi du temps. */
		String SCHEDULE_LAST_UPDATE = "last_update"; //$NON-NLS-1$
		/** Ressources ADE de l'emploi du temps. */
		String SCHEDULE_RESOURCES = "resources"; //$NON-NLS-1$
		/** Numéros étudiants de l'emploi du temps. */
		String SCHEDULE_STUDENT_NUM = "student_numbers"; //$NON-NLS-1$
		/**
		 * Toutes les ressources (ressources et ressources des numéros
		 * étudiants) de l'emploi du temps.
		 */
		String SCHEDULE_ALL_RESOURCES = "all_resources"; //$NON-NLS-1$
		/** Nombre de jours récupérées pendant la synchronisation. */
		String SCHEDULE_PERIOD = "sync_period"; //$NON-NLS-1$
		/** Date de création dans notre application de l'emploi du temps. */
		String SCHEDULE_CREATED = "created"; //$NON-NLS-1$
		/** Identifiant dans notre application du projet de l'emploi du temps. */
		String SCHEDULE_PROJECT = "project"; //$NON-NLS-1$
		/**
		 * Indique s"il faut notifier les changements importants sur l'emploi du
		 * temps.
		 */
		String SCHEDULE_NOTIFY_UPDATE = "notify_update"; //$NON-NLS-1$
		/** Indique s'il y a une changement important dans l'emploi du temps. */
		String SCHEDULE_IMPORTANT_CHANGE = "important_change"; //$NON-NLS-1$

		/** Identifiant ADE du projet de l'emploi du temps. */
		String SCHEDULE_ADE_PROJECT_ID = "project_id"; //$NON-NLS-1$
		/** Nom du projet de l'emploi du temps. */
		String SCHEDULE_PROJECT_NAME = "project_name"; //$NON-NLS-1$
	}

	/**
	 * Attributs relatifs aux cours.
	 */
	interface LessonColumns {
		/** Titre (nom) du cours. */
		String LESSON_TITLE = "title"; //$NON-NLS-1$
		/** Date à laquelle se tient le cours. */
		String LESSON_DATE = "date"; //$NON-NLS-1$
		/** Heure de début du cours. */
		String LESSON_START_TIME = "start_time"; //$NON-NLS-1$
		/** Heure de fin du cours. */
		String LESSON_END_TIME = "end_time"; //$NON-NLS-1$
		/** Identifiant de l'emploi du temps content le cours. */
		String LESSON_SCHEDULE = "schedule"; //$NON-NLS-1$
		/** Niveau de changement suite à une synchronisation du cours. */
		String LESSON_CHANGE = "change"; //$NON-NLS-1$
		/** Date de création dans notre application du cours. */
		// FIXME Modifier en date de création dans ADE
		String LESSON_CREATED = "created"; //$NON-NLS-1$
		/** Salles où se tiendra le cours. */
		String LESSON_ROOMS = "rooms"; //$NON-NLS-1$
		/** Groupes auxquels est assigné le cours. */
		String LESSON_GROUPS = "groups"; //$NON-NLS-1$
		/** Noms des enseignants assignés au cours. */
		String LESSON_TEACHERS = "teachers"; //$NON-NLS-1$
		/** Code de la couleur utilisée par ADE pour l'affichage du cours. */
		String LESSON_COLOR = "color"; //$NON-NLS-1$
		/** Notes facultatives du cours. */
		String LESSON_NOTE = "note"; //$NON-NLS-1$
		/** Identifiant du cours pour ADE. */
		String LESSON_GUID = "guid"; //$NON-NLS-1$
		/** Indique si le cours a été supprimé suite à une sycnrhonisation. */
		String LESSON_DELETED = "deleted"; //$NON-NLS-1$
		/** Date de dernière mise à jour sur ADE du cours. */
		String LESSON_LAST_UPDATE = "last_update";//$NON-NLS-1$

		/** Ordre d'affichage du cours (ou de cet élément). */
		String LESSON_ORDER = "display_order";//$NON-NLS-1$
		/** Type de cet élément (cours, séparateur, ...). */
		String LESSON_TYPE = "type";//$NON-NLS-1$
		/** Identifiant du cours associé à cet élément d'affichage. */
		String LESSON_ID = "lesson_id"; //$NON-NLS-1$

		/**
		 * Ancienne date de déroulement du cours avant la dernière
		 * synchronisation.
		 */
		String LESSON_OLD_DATE = "old_date"; //$NON-NLS-1$
		/** Ancienne heure de début du cours avant la dernière synchronsation. */
		String LESSON_OLD_START_TIME = "old_start_time"; //$NON-NLS-1$
		/** Ancienne heure de fin du cours avant la dernière synchronisation. */
		String LESSON_OLD_END_TIME = "old_end_time"; //$NON-NLS-1$
		/** Anciennes salles du cours avant la dernière synchronisation. */
		String LESSON_OLD_ROOMS = "old_rooms"; //$NON-NLS-1$
	}

	/**
	 * Attributs relatifs aux projets ADE.
	 */
	interface ProjectColumns {
		/** Identifiant ADE du projet. */
		String PROJECT_ADEWEB_ID = "project_id"; //$NON-NLS-1$
		/** Nom du projet. */
		String PROJECT_NAME = "project_name"; //$NON-NLS-1$
		String PROJECT_LOADED = "loaded"; //$NON-NLS-1$
	}

	/**
	 * Attributs relatifs aux numéros étudiants et leurs ressources associés.
	 */
	interface StudentNumberColumns {
		/** Date de création dans notre application de cette correspondance. */
		String STUDENT_NUMBER_CREATED = "created"; //$NON-NLS-1$
		/** Numéro étudiant. */
		String STUDENT_NUMBER_STUDENT_NUMBER = "student_number"; //$NON-NLS-1$
		/** Ressources associées au numéro etudiant. */
		String STUDENT_NUMBER_RESOURCES = "resources"; //$NON-NLS-1$
	}

	/**
	 * Atrributs relatifs aux messages d'erreurs.
	 */
	interface ErrorColumns {
		/** Identifiant de l'emploi du temps associé à l'erreur. */
		String ERROR_SCHEDULE = "schedule"; //$NON-NLS-1$
		/** Date de création de message d'erreur. */
		String ERROR_DATE = "date"; //$NON-NLS-1$
		/** Message d'erreur d'origine. */
		String ERROR_MESSAGE = "message"; //$NON-NLS-1$
		/** Numéro identifiant le message d'erreur. */
		String ERROR_NUMBER = "number"; //$NON-NLS-1$
		/** Entier identifiant le type d'erreur. */
		String ERROR_TYPE = "type"; //$NON-NLS-1$
	}

	/**
	 * Emplois du temps des utilisateurs ADE. Les cours sont dans {@link Lesson}
	 * .
	 */
	public static class Schedule
			implements ScheduleColumns, BaseColumns {
		public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon()
				.appendPath(PATH_SCHEDULE).build();

		public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.ade.prime.schedule"; //$NON-NLS-1$
		public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.ade.prime.schedule"; //$NON-NLS-1$ 

		public static final String DEFAULT_SORT = ScheduleColumns.SCHEDULE_NAME
				+ " ASC"; //$NON-NLS-1$

		public static final String SORT_BY_ADE_PROJECT_ID = ScheduleColumns.SCHEDULE_ADE_PROJECT_ID
				+ " ASC"; //$NON-NLS-1$

		public static Uri buildUri(long scheduleId) {
			return ContentUris.withAppendedId(CONTENT_URI, scheduleId);
		}
	}

	/**
	 * Cours des emplois du temps ainsi que leur historique récent et des
	 * méta-données d'affichage.
	 */
	public static class Lesson
			implements LessonColumns, BaseColumns {
		protected static final Uri CONTENT_URI = Schedule.CONTENT_URI;

		public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.ade.prime.lesson"; //$NON-NLS-1$
		public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.ade.prime.lesson"; //$NON-NLS-1$

		/**
		 * Construit l'URI pour accéder à tous les cours d'un emploi du temps
		 * donné.
		 * 
		 * @param scheduleId
		 *            identifiant de l'emploi du temps duquel on veut récupérer
		 *            les cours
		 * @return URI pour les cours de l'emploi du temps donné
		 */
		public static Uri buildLessonUri(long scheduleId) {
			return ContentUris.appendId(CONTENT_URI.buildUpon(), scheduleId)
					.appendPath(PATH_LESSON).build();
		}

		/**
		 * Construit l'URI pour accéder à tous les éléments d'affichage d'un
		 * emploi du temps donné.
		 * 
		 * @param scheduleId
		 *            identifiant de l'emploi du temps duquel on veut récupérer
		 *            les cours
		 * @return URI pour les cours de l'emploi du temps donné
		 */
		public static Uri buildDisplayUri(long scheduleId) {
			return ContentUris.appendId(CONTENT_URI.buildUpon(), scheduleId)
					.appendPath(PATH_DISPLAY).build();
		}

		/**
		 * Construit l'URI pour accéder à l'élément d'affichage d'un emploi du
		 * temps donné.
		 * 
		 * @param scheduleId
		 *            identifiant de l'emploi du temps duquel on veut récupérer
		 *            les cours
		 * @param displayId
		 *            identifiant de l'élément d'affichage à récupérer
		 * @return URI pour les cours de l'emploi du temps donné
		 */
		public static Uri buildDisplayUri(long scheduleId, long displayId) {
			return ContentUris.withAppendedId(buildDisplayUri(scheduleId),
					displayId);
		}

		/**
		 * Construit l'URI pour accéder à tous les cours d'un emploi du temps
		 * donné dans la période spécifiée.
		 * 
		 * @param scheduleId
		 *            identifiant de l'emploi du temps duquel on veut récupérer
		 *            les cours
		 * @param start
		 *            date et heure de début dela période (inclus)
		 * @param end
		 *            date et heure de fin de la période (inclus)
		 * @return URI pour les cours spécifiés
		 */
		public static Uri buildLessonBetweenUri(long scheduleId, String start,
				String end) {
			return buildLessonUri(scheduleId).buildUpon()
					.appendPath(PATH_BETWEEN).appendPath(Uri.encode(start))
					.appendPath(Uri.encode(end)).build();
		}

		/**
		 * Construit l'URI pour accéder à tous les éléments d'affichage d'un
		 * emploi du temps donné dans la période spécifiée.
		 * 
		 * @param scheduleId
		 *            identifiant de l'emploi du temps duquel on veut récupérer
		 *            les cours
		 * @param start
		 *            date et heure de début dela période (inclus)
		 * @param end
		 *            date et heure de fin de la période (inclus)
		 * @return URI pour les cours spécifiés
		 */
		public static Uri buildDisplayBetweenUri(long scheduleId, String start,
				String end) {
			return buildDisplayUri(scheduleId).buildUpon()
					.appendPath(PATH_BETWEEN).appendPath(Uri.encode(start))
					.appendPath(Uri.encode(end)).build();
		}

		public static long getScheduleId(Uri uri) {
			return Long.parseLong(uri.getPathSegments().get(1));
		}

		public static final String DEFAULT_SORT = LessonColumns.LESSON_DATE
				+ " ASC, " + LessonColumns.LESSON_START_TIME + " ASC"; //$NON-NLS-1$ //$NON-NLS-2$

		public static final String SORT_BY_ORDER = LessonColumns.LESSON_ORDER
				+ " ASC"; //$NON-NLS-1$

		/**
		 * Format pour une requête (partie WHERE) sélectionnant tous les
		 * éléments avec les identifiants fournis. Les identifiants doivent être
		 * séparés par des virgules (voir {@link #ID_SEPARATOR}).
		 */
		public static final String QUERY_ID_IN = BaseColumns._ID + " IN (%s)"; //$NON-NLS-1$

		/**
		 * Séparataeur pour les identifiants.
		 */
		public static final String ID_SEPARATOR = ","; //$NON-NLS-1$
	}

	/**
	 * Projets ADE regroupant les emplois du temps des établissements.
	 */
	public static class Project
			implements ProjectColumns, BaseColumns {
		public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon()
				.appendPath(PATH_PROJECT).build();

		public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.ade.prime.project"; //$NON-NLS-1$
		public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.ade.prime.project"; //$NON-NLS-1$

		public static final String DEFAULT_SORT = BaseColumns._ID + " ASC"; //$NON-NLS-1$
	}

	/**
	 * Contient les resources des emplois du temps liés aux numéros étudiants.
	 */
	public static class StudentNumber
			implements StudentNumberColumns, BaseColumns {
		public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon()
				.appendPath(PATH_STUDENT_NUMBER).build();

		public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.ade.prime.student_number"; //$NON-NLS-1$
		public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.ade.prime.student_number"; //$NON-NLS-1$

		public static final String DEFAULT_SORT = BaseColumns._ID + " ASC"; //$NON-NLS-1$
	}

	/**
	 * Contient les messages pour les erreurs de création, édition et
	 * synchronisation d'emploi du temps.
	 */
	public static class Error
			implements ErrorColumns, BaseColumns {
		public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon()
				.appendPath(PATH_ERROR).build();
		public static final Uri SCHEDULE_ERRORS_URI = CONTENT_URI.buildUpon()
				.appendPath(PATH_SCHEDULE).build();
		public static final Uri SCHEDULE_CREATE_ERRORS_URI = SCHEDULE_ERRORS_URI
				.buildUpon().appendPath(PATH_CREATE).build();

		public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.ade.prime.error"; //$NON-NLS-1$
		public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.ade.prime.error"; //$NON-NLS-1$

		public static final String DEFAULT_SORT = ErrorColumns.ERROR_DATE
				+ " DESC"; //$NON-NLS-1$

		/**
		 * Construit l'URI pour accéder aux messages d'erreur d'un emploi du
		 * temps.
		 * 
		 * @param scheduleId
		 *            identifiant de l'emploi du temps duquel on veut récupérer
		 *            les messages d'erreurs
		 * @return URI pour les messages d'erreurs de l'emploi du temps donné
		 */
		public static Uri buildScheduleUri(long scheduleId) {
			return ContentUris.withAppendedId(SCHEDULE_ERRORS_URI, scheduleId);
		}
	}

}// class AdeWebContract